/**
 * edit by linxi 物联18-2 201803040075
 *
 * 将P17跳线自上向下接到P5跳线帽PB12 PB13 PB14 PB15 作为row选择线 
 * 将P18跳线自上向下接到P5跳线帽PB8 PB9 PB10 PB11 作为col选择线
 * 
 */

#include "matrix_key.h"
#include "delay.h"
/**
  * @brief  矩阵键盘初始化
  * @param  None
  * @retval None
  */
void MATRIX_KEY_Init() {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin =
        GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin =
        GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	delay_init();
}
/**
  * @brief  矩阵键盘扫描
  * @param  None
  * @retval 扫描后的键值
  */
u8 MATRIX_KEY_Scan() {
    u8 key_val = 0;

    ROW_EN(ROW1);
    COL_Scan(&key_val, 1, 2, 3, 4);

    ROW_EN(ROW2);
    COL_Scan(&key_val, 5, 6, 7, 8);

    ROW_EN(ROW3);
    COL_Scan(&key_val, 9, 10, 11, 12);

    ROW_EN(ROW4);
    COL_Scan(&key_val, 13, 14, 15, 16);

    return key_val;
}
/**
  * @brief  行的使能
  * @param  row 为对应行
  * @retval None
  */
void ROW_EN(u16 row) {
    // row <<= 8;
    // GPIOB->BSRR = (row & 0xff00) | (~row & 0xff00) << 16;
    GPIO_ResetBits(GPIOB, row);
    GPIO_SetBits(GPIOB, ~row);
}
/**
  * @brief  列扫描
  * @param  key_val 扫描后的键值
  * @param  col1 第一个按键扫描后所要赋的值
  * @retval None
  */
void COL_Scan(u8* key_val, u8 col1, u8 col2, u8 col3, u8 col4) {
    if (~(GPIO_ReadInputData(GPIOB) & 0xf000)) {
        delay_ms(5);
        if (!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15)) {
            *key_val = col1;
        }
        if (!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14)) {
            *key_val = col2;
        }
        if (!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)) {
            *key_val = col3;
        }
        if (!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)) {
            *key_val = col4;
        }
    }
}
